package utils.delegate;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Klasa umozliwia zapamiętywanie konkretnych metod obiektów i wywoływanie ich w
 * każdej chwili
 * 
 * @author kasztan
 * @version 1.0
 */
public class MethodDelegate
{
	private Object methodOwnerInstance;
	private Method callback;
	private Object[] arguments;
	
	/**
	 * Konstruktor
	 * @param instance obiekt, którego metodę chcemy zarejestrować
	 * @param method metoda do zarejestrowania
	 * @param invokeArguments argumenty rejestrowanej metody
	 * @throws IllegalArgumentException
	 */
	public MethodDelegate(Object instance, Method method,
			Object[] invokeArguments) throws IllegalArgumentException
	{
		try
		{
			instance.getClass().getMethod(method.getName(),
					method.getParameterTypes());
		} catch (Exception e)
		{
			throw new IllegalArgumentException();
		}
		
		methodOwnerInstance = instance;
		callback = method;
		arguments = invokeArguments;
	}

	public void invoke() throws InvocationTargetException
	{
		try
		{
			callback.invoke(methodOwnerInstance, arguments);
		} catch (IllegalArgumentException e)
		{
			System.err.println("MethodDelegate.invoke exception: " + e);
			e.printStackTrace();
		} catch (IllegalAccessException e)
		{
			System.err.println("MethodDelegate.invoke exception: " + e);
			e.printStackTrace();
		} catch (InvocationTargetException e)
		{
			throw e;
		}
	}
}
